package com.lc.reggie.filter;

import com.alibaba.fastjson.JSON;
import com.lc.reggie.common.BaseContext;
import com.lc.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 检查用户是否已经完成登录
 */
@Slf4j
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
public class LoginCheckFilter implements Filter
{
	//路径匹配器，支持通配符
	public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
	
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
	{
		HttpServletRequest req = (HttpServletRequest) servletRequest;
		HttpServletResponse res = (HttpServletResponse) servletResponse;

		
		//1、获取本次请求的URI
		String reqURI = req.getRequestURI();
//		log.info("拦截到请求： {}", reqURI);
		
		//定义不需要处理的请求路径
		String[] urls = new String[]{
				"/employee/login",
				"/employee/logout",
				"/backend/**",
				"/front/**",
				"/common/**",
				"/user/sendMsg",
				"/user/login",
				"/doc.html",
				"/webjars/**",
				"/swagger-resources",
				"/v2/api-docs"
		};
		
		//2、判断本次请求是否需要处理
		boolean check = check(urls, reqURI);
		
		//3、如果不需要处理，则直接放行
		if (check)
		{
//			log.info("本次请求{}不需要处理",reqURI);
			filterChain.doFilter(req, res);
			return;
		}
		
		//4-1、判断后台登录状态，如果已登录，则直接放行
		if (req.getSession().getAttribute("employee") != null)
		{
			log.info("用户已登录，用户id为：{}",req.getSession().getAttribute("employee"));
			
			Long empId = (Long) req.getSession().getAttribute("employee");
			BaseContext.setCurrentId(empId);
			//			long id = Thread.currentThread().getId();
//			log.info("线程id为：{}", id);
			
			filterChain.doFilter(req, res);
			return;
		}
		
		//4-2、判断前台登录状态，如果已登录，则直接放行
		if (req.getSession().getAttribute("user") != null)
		{
			log.info("用户已登录，用户id为：{}",req.getSession().getAttribute("user"));
			
			Long userId = (Long) req.getSession().getAttribute("user");
			BaseContext.setCurrentId(userId);
			//			long id = Thread.currentThread().getId();
			//			log.info("线程id为：{}", id);
			
			filterChain.doFilter(req, res);
			return;
		}
		
		log.info("用户未登录");
		//5、如果未登录则返回未登录结果，通过输出流方式向客户端页面响应数据
		res.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
		return;
	}
	
	/**
	 * 路径匹配，检查本次请求是否需要放行
	 * @param urls
	 * @param reqURI
	 * @return
	 */
	private boolean check(String[] urls, String reqURI)
	{
		for (String url : urls)
		{
			boolean match = PATH_MATCHER.match(url, reqURI);
			if (match) return true;
		}
		return false;
	}
}
